{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5 计算和控制流（一）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.给定 $n$，计算 $1 + 2! + 3! + ... + n!$ 的值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "n =  4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "33\n"
     ]
    }
   ],
   "source": [
    "n = int(input('n = '))  # 输入 n 值\n",
    "\n",
    "total = 0\n",
    "\n",
    "for i in range(1, n+1):\n",
    "    factorial = 1\n",
    "    \n",
    "    for j in range(1, i+1):\n",
    "        factorial *= j  # 阶乘\n",
    "    \n",
    "    total += factorial  # 求和\n",
    "\n",
    "print(total)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.给定 y 和 m，计算 y 年 m 月有几天？\n",
    "\n",
    "> 闰年定义：闰年是公历中的名词。闰年分为普通闰年和世纪闰年。\n",
    "\n",
    "> 普通闰年：公历年份是4的倍数的，且不是100的倍数，为普通闰年（如2004年、2020年就是闰年）。\n",
    "\n",
    "> 世纪闰年：公历年份是整百数的，必须是400的倍数才是世纪闰年（如1900年不是世纪闰年，2000年是世纪闰年）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "年份 y =  1900\n",
      "月份 m =  2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1900 年 2 月有 28 天\n"
     ]
    }
   ],
   "source": [
    "y = int(input('年份 y = '))\n",
    "m = int(input('月份 m = '))\n",
    "\n",
    "calendar = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30,\n",
    "            7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}  # 用字典定义月份与天数的关系\n",
    "\n",
    "if m != 2:\n",
    "    print('%d 年 %d 月有 %d 天' % (y, m, calendar[m]))\n",
    "else:\n",
    "    if y % 4 != 0:  # 不是闰年，照常输出 2 月天数\n",
    "        print('%d 年 %d 月有 %d 天' % (y, m, calendar[m]))\n",
    "        \n",
    "    else:  # 有可能是闰年，进一步判断\n",
    "        if y % 100 != 0:    # 不是 100 的整数，普通闰年，2 月天数 +1\n",
    "            print('%d 年 %d 月有 %d 天' % (y, m, calendar[m] + 1))\n",
    "        elif y % 400 == 0:  # 是 400 的整数，世纪闰年，2 月天数 +1\n",
    "            print('%d 年 %d 月有 %d 天' % (y, m, calendar[m] + 1))\n",
    "        else:  # 是 100 但不是 400 的整数，不是闰年，照常输出 2 月天数\n",
    "            print('%d 年 %d 月有 %d 天' % (y, m, calendar[m]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.给定字符串 s 和数字 n，打印把字符串 s 向右移动 n 位的新字符串\n",
    "> `s = 'abcd'`, `n = 1`, 输出 `'dabc'`\n",
    "\n",
    "> `s = 'mnbol'`, `n = 2`, 输出 `'olmnb'`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "输入字符串 s =  mnbol\n",
      "输入数字 n =  2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "olmnb\n"
     ]
    }
   ],
   "source": [
    "s = input('输入字符串 s = ')\n",
    "n = int(input('输入数字 n = '))\n",
    "\n",
    "s_len = len(s)\n",
    "n = n % s_len\n",
    "\n",
    "s_prev = s[:s_len - n]\n",
    "s_next = s[s_len - n:]\n",
    "\n",
    "s_new = ''.join([s_next, s_prev])\n",
    "print(s_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.给定一个英文数字字符串，打印相应阿拉伯数字字符串\n",
    "> 输入：one-four-five-nine, 输出：1459"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "输入英文数字字符串 s =  one-four-six-nine\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1469\n"
     ]
    }
   ],
   "source": [
    "counterpart = {'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4',\n",
    "               'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9'}\n",
    "\n",
    "s = input('输入英文数字字符串 s = ').split('-')\n",
    "out = []\n",
    "for i in s:\n",
    "    out.append(counterpart[i])\n",
    "print(''.join(out))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
